home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / talog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.5 KB  |  264 lines

  1. /* -*-C-*- talog.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*#     program to test alog
  6. #
  7. #     data required
  8. #
  9. #        none
  10. #
  11. #     subprograms required from this package
  12. #
  13. #        machar - an environmental inquiry program providing
  14. #                 information on the floating-point arithmetic
  15. #                 system.  note that the call to machar can
  16. #                 be deleted provided the following four
  17. #                 parameters are assigned the values indicated
  18. #
  19. #                 ibeta - the radix of the floating-point system
  20. #                 it    - the number of base-ibeta digits in the
  21. #                         significand of a floating-point number
  22. #                 xmin  - the smallest non-vanishing floating-point
  23. #                         power of the radix
  24. #                 xmax  - the largest finite floating-point no.
  25. #
  26. #        ran(k) - a function subprogram returning random real
  27. #                 numbers uniformly distributed over (0,1)
  28. #
  29. #
  30. #     standard fortran subprograms required
  31. #
  32. #         abs, alog, alog10, amax1, float, sign, sqrt
  33. #
  34. #
  35. #     latest revision - december 6, 1979
  36. #
  37. #     author - w. j. cody
  38. #              argonne national laboratory
  39. #
  40. #*/
  41.  
  42. void
  43. talog()
  44. {
  45.     int             i, ibeta, iexp, irnd, it, i1, j, k1, k2, k3,
  46.             machep, maxexp, minexp, n, negep, ngrd;
  47.     float           a, ait, albeta, b, beta, c, del, eight, eps,
  48.             epsneg, half, r6, r7, tenth, w, x, xl,
  49.             xmax, xmin, xn, x1, y, z, zz;
  50.  
  51.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  52.        &maxexp, &eps, &epsneg, &xmin, &xmax);
  53.  
  54.     beta = (float) ibeta;
  55.     albeta = ALOG(beta);
  56.     ait = (float) it;
  57.     j = it / 3;
  58.     half = 0.5e0L;
  59.     eight = 8.0e0L;
  60.     tenth = 0.1e0L;
  61.     c = ONE;
  62.  
  63.     for (i = 1; i <= j; ++i)
  64.     c = c / beta;
  65.  
  66.     b = ONE + c;
  67.     a = ONE - c;
  68.     n = 2000;
  69.     xn = (float) (n);
  70.     i1 = 0;
  71.  
  72.     /* random argument accuracy tests */
  73.  
  74.     for (j = 1; j <= 4; ++j)
  75.     {
  76.     k1 = 0;
  77.     k3 = 0;
  78.     x1 = ZERO;
  79.     r6 = ZERO;
  80.     r7 = ZERO;
  81.     del = (b - a) / xn;
  82.     xl = a;
  83.  
  84.     for (i = 1; i <= n; ++i)
  85.     {
  86.         x = del * ran(i1) + xl;
  87.         if (j == 1)
  88.         {
  89.         y = (x - half);
  90.         y -= half;
  91.         zz = ALOG(x);
  92.         z = ONE / 3.0e0;
  93.         z = y * (z - y / 4.0e0);
  94.         z = (z - half) * y * y + y;
  95.         }
  96.         else if (j == 2)
  97.         {
  98.         x += eight;
  99.         x -= eight;
  100.         y = x + x / 16.0e0;
  101.         z = ALOG(x);
  102.         /* zz = ALOG(y) - 7.7746816434842581e-5;
  103.         zz = zz - 31.0e0 / 512.0e0; */
  104.         zz = ALOG(y) - ALOG(17.0L/16.0L);
  105.         }
  106.         else if (j != 3)
  107.         {
  108.         z = ALOG(x * x);
  109.         zz = ALOG(x);
  110.         zz = zz + zz;
  111.         }
  112.         else
  113.         {
  114.         x += eight;
  115.         x -= eight;
  116.         y = x + x * tenth;
  117.         /* y = 1.1L*x; */
  118.         z = ALOG10(x);
  119.         zz = ALOG10(y) - 3.7706015822504075e-4L;
  120.         zz = zz - 21.0e0L / 512.0e0L;
  121.         /* zz = ALOG10(y) - ALOG10(1.1L); */
  122.         }
  123.         w = ONE;
  124.         if (z != ZERO)
  125.         w = (z - zz) / z;
  126.         z = SIGN(w, z);
  127.         if (z > ZERO)
  128.         k1 = k1 + 1;
  129.         if (z < ZERO)
  130.         k3 = k3 + 1;
  131.         w = ABS(w);
  132.         if (w > r6)
  133.         {
  134.         r6 = w;
  135.         x1 = x;
  136.         }
  137.         r7 = r7 + w * w;
  138.         xl = xl + del;
  139.     }
  140.  
  141.     k2 = n - k3 - k1;
  142.     r7 = sqrt(r7 / xn);
  143.     if (j == 1)
  144.         printf("\fTEST OF ALOG(X) VS T.S. EXPANSION OF ALOG(1+Y)\n\n\n");
  145.     else if (j == 2)
  146.         printf("\fTEST OF ALOG(X) VS ALOG(17X/16)-ALOG(17/16)\n\n\n");
  147.     else if (j == 3)
  148.         printf("\fTEST OF ALOG10(X) VS ALOG10(11X/10)-ALOG10(11/10)\n\n\n");
  149.     else if (j == 4)
  150.         printf("\fTEST OF ALOG(X*X) VS 2 * LOG(X)\n\n\n");
  151.     if (j == 1)
  152.     {
  153.         printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  154.         printf("      (1-EPS,1+EPS), WHERE EPS =" F15P4E "\n\n\n", c);
  155.     }
  156.     else
  157.     {
  158.         printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  159.         printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  160.     }
  161.     if (j != 3)
  162.     {
  163.         printf(" ALOG(X) WAS LARGER%6d TIMES,\n", k1);
  164.         printf("             AGREED%6d TIMES, AND\n", k2);
  165.         printf("        WAS SMALLER%6d TIMES.\n\n\n", k3);
  166.     }
  167.     else
  168.     {
  169.         printf(" ALOG10(X) WAS LARGER%6d TIMES,\n", k1);
  170.         printf("               AGREED%6d TIMES, AND\n", k2);
  171.         printf("          WAS SMALLER%6d TIMES.\n\n\n", k3);
  172.     }
  173.     printf(
  174.           " THERE ARE%4d BASE%4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n\n",
  175.           it, ibeta);
  176.     w = -999.0e0;
  177.     if (r6 != ZERO)
  178.         w = ALOG(ABS(r6)) / albeta;
  179.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  180.            r6, ibeta, w);
  181.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  182.     w = AMAX1(ait + w, ZERO);
  183.     printf(
  184.           " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  185.           ibeta, w);
  186.     w = -999.0e0;
  187.     if (r7 != ZERO)
  188.         w = ALOG(ABS(r7)) / albeta;
  189.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  190.            r7, ibeta, w);
  191.     w = AMAX1(ait + w, ZERO);
  192.     printf(
  193.           " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  194.           ibeta, w);
  195.     if (j <= 1)
  196.     {
  197.         a = sqrt(half);
  198.         b = 15.0e0 / 16.0e0;
  199.     }
  200.     else if (j > 2)
  201.     {
  202.         a = 16.0e0;
  203.         b = 240.0e0;
  204.     }
  205.     else
  206.     {
  207.         a = sqrt(tenth);
  208.         b = 0.9e0;
  209.     }
  210.     }
  211.  
  212.     /* special tests */
  213.  
  214.     printf("\fSPECIAL TESTS\n\n\n");
  215.     printf(" THE IDENTITY  ALOG(X) = -ALOG(1/X)  WILL BE TESTED.\n\n");
  216.     printf("        X         F(X) + F(1/X)\n\n");
  217.  
  218.     for (i = 1; i <= 5; ++i)
  219.     {
  220.     x = ran(i1);
  221.     x = x + x + 15.0e0;
  222.     y = ONE / x;
  223.     z = ALOG(x) + ALOG(y);
  224.     printf(F15P7E F15P7E "\n\n", x, z);
  225.     }
  226.  
  227.     printf("\n\n TEST OF SPECIAL ARGUMENTS\n\n\n");
  228.     x = ONE;
  229.     y = ALOG(x);
  230.     printf(" ALOG(1.0) = " F15P7E "\n\n\n", y);
  231.     x = xmin;
  232.     y = ALOG(x);
  233.     printf(" ALOG(XMIN) = ALOG(" F15P7E ") = " F15P7E "\n\n\n", x, y);
  234.     x = xmax;
  235.     y = ALOG(x);
  236.     printf(" ALOG(XMAX) = ALOG(" F15P7E ") = " F15P7E "\n\n\n", x, y);
  237.  
  238.     /* test of error returns */
  239.  
  240.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  241.  
  242.     x = -2.0e0;
  243.     printf(" ALOG WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n", x);
  244.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  245.     fflush(stdout);
  246.     errno = 0;
  247.     y = ALOG(x);
  248.     if (errno)
  249.     perror("ALOG()");
  250.     printf(" ALOG RETURNED THE VALUE" F15P4E "\n\n\n", y);
  251.  
  252.     x = ZERO;
  253.     printf(" ALOG WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n", x);
  254.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  255.     fflush(stdout);
  256.     errno = 0;
  257.     y = ALOG(x);
  258.     if (errno)
  259.     perror("ALOG()");
  260.     printf(" ALOG RETURNED THE VALUE" F15P4E "\n\n\n\n", y);
  261.  
  262.     printf(" THIS CONCLUDES THE TESTS\n");
  263. }
  264.